package com.date.demo01;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {
    public static void main(String[] args) throws ParseException {
        System.out.println("java日期类的学习！");
        /**
         * Java表示时间的标准库API
         * 我们再来看一下Java标准库提供的API。Java标准库有两套处理日期和时间的API：
         *
         * 一套定义在java.util这个包里面，主要包括Date、Calendar和TimeZone（很少使用）这几个类；
         * 一套新的API是在Java 8引入的，定义在java.time这个包里面，主要包括LocalDateTime、ZonedDateTime、ZoneId等。
         */

        /**
         * Java使用long型来表示以毫秒为单位的时间戳，通过System.currentTimeMillis()获取当前时间戳。
         *
         * java.util.Date 类基本用法
         * Date表示特定的瞬间，精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代
         *
         * 时间单位：1s = 1,000ms = 1,000,000 μs = 1,000,000,000 = ns
         *
         * getYear();    获取年份 必须加 1900  返回 int  类型  已过时
         * getMonth();   获取月份 必须加 1     返回 int  类型  已过时
         * getDate();    获取日期 1 ~ 31      返回 int  类型  已过时
         * getTime();    获取当前时间戳毫秒     返回 long 类型  常用
         */
        // 获取当前时间
        Date date = new Date();
        System.out.println(date); // Wed Dec 22 15:52:53 CST 2021  英文表现形式
        System.out.println(date.getYear()+1990); // 获取当前年份 必须 +1900  2021
        System.out.println(date.getMonth()+1); // 获取当前月份 必须 +1
        System.out.println(date.getDate()); // 获取当前日期 1~ 31
        // 装换成为字符串
        System.out.println(date.toString()); // Wed Dec 22 15:57:35 CST 2021
        // 转成为本地时间
        System.out.println(date.toLocaleString()); // 2021-12-22 15:57:35
        // 昨天时间
        System.out.println(date.getTime());// 1640160296537 获取当前的时间戳 毫秒
        Date date2 = new Date(date.getTime() - (60*60*24*1000)); // 昨天时间
        System.out.println(date2.toLocaleString());

        /**
         * 格式化时间操作 SimpleDateFormat("格式") 默认格式是 21-12-22 下午4:09
         * 由于 Date类中 奇葩行为 getYear() 需要加 1990
         * getMonth() 月份加 1
         * getDate() 日期不加 1
         * 为了更好的体现时间，需要对时间进行格式化操作.
         *  yyyy：年 MM：月 dd: 日 HH: 小时 mm: 分钟 ss: 秒
         *  "yyyy/MM/dd HH-mm-ss" ,"yyyy-MM-dd HH:mm:ss" 格式随你定
         */
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date_str = simpleDateFormat.format(date);
        System.out.println(date_str); // 2021-12-22 16:12:17

        // 格式化date（日期→字符串）
        Date date3 = new Date();
        String s = simpleDateFormat.format(date3.getTime()); // 2021-12-22 17:44:09
        System.out.println(s);
        // 解析（字符串→时间）
        Date date4 = simpleDateFormat.parse("2018-03-12 14:25:60");
        System.out.println(date4); // 返回 Mon Mar 12 14:26:00 CST 2018 英文表现形式

        // SimpleDateFormat 和 字符串日期的格式不一样  报异常：java.text.ParseException
        String data_str = "2021/12/12 15:13:40";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d_str =  sdf.parse(data_str);
        System.out.println(d_str);

        // 扩展 System.currentTimeMillis() 获取当前时间戳 毫秒
        System.out.println(System.currentTimeMillis());
    }
}
